package PL.prac10;

import java.io.*;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTreeAdaptor;


/**
 * Hello world!
 *
 */
public class App 
{	
	//Si no no funciona.
    static class MyNodeAdaptor extends CommonTreeAdaptor {

        @Override
        public Object create(Token payload) {
            return new MiArbol(payload);
        }
    }
	
    
    public static void EjecutaCalc (String fich) throws IOException{
    	try {
			ANTLRFileStream fis = new ANTLRFileStream(fich);
			CalcLexer analex = new CalcLexer(fis);
			CommonTokenStream tokens = new CommonTokenStream(analex);
			CalcParser anasint = new CalcParser(tokens);
			MyNodeAdaptor adaptor = new MyNodeAdaptor();
			anasint.setTreeAdaptor(adaptor); // use my adaptor
			CalcParser.entrada_return result = anasint.entrada();
			MiArbol arbol = (MiArbol) result.getTree();
			ASTFrame frame = new ASTFrame(fich, arbol);
            frame.setVisible(true);
            System.out.println(arbol.toStringTree());
		}
		catch (RecognitionException re) {
			System.err.println(re.getMessage());
		}
		catch(FileNotFoundException fnfe) {
			System.err.println("No existe el fichero");
		}
    }
    
    public static void EjecutaC (String fich) throws IOException{
    	try {
			ANTLRFileStream fis = new ANTLRFileStream(fich);
			CLexer analex = new CLexer(fis);
			CommonTokenStream tokens = new CommonTokenStream(analex);
			CParser anasint = new CParser(tokens);
			MyNodeAdaptor adaptor = new MyNodeAdaptor();
			anasint.setTreeAdaptor(adaptor); // use my adaptor
			CParser.entrada_return result = anasint.entrada();
			MiArbol arbol = (MiArbol) result.getTree();
			ASTFrame frame = new ASTFrame(fich, arbol);
            frame.setVisible(true);
            System.out.println(arbol.toStringTree());
		}
		catch (RecognitionException re) {
			System.err.println(re.getMessage());
		}
		catch(FileNotFoundException fnfe) {
			System.err.println("No existe el fichero");
		}
    }
    
    public static void EjecutaXML (String fich) throws IOException{
    	try {
			ANTLRFileStream fis = new ANTLRFileStream(fich);
			XMLLexer analex = new XMLLexer(fis);
			CommonTokenStream tokens = new CommonTokenStream(analex);
			XMLParser anasint = new XMLParser(tokens);
			MyNodeAdaptor adaptor = new MyNodeAdaptor();
			anasint.setTreeAdaptor(adaptor); // use my adaptor
			XMLParser.entrada_return result = anasint.entrada();
			MiArbol arbol = (MiArbol) result.getTree();
			ASTFrame frame = new ASTFrame(fich, arbol);
            frame.setVisible(true);
            System.out.println(arbol.toStringTree());
		}
		catch (RecognitionException re) {
			System.err.println(re.getMessage());
		}
		catch(FileNotFoundException fnfe) {
			System.err.println("No existe el fichero");
		}
    }
    
    public static void printopciones() {
		System.out.println("	0: Analizador del enunciado.");
		System.out.println("	1: Analizador de C.");
		System.out.println("	2: Analizador de XML.");
    }
    
    public static void main (String args[]) throws IOException {
    	if (args.length != 2) {
    		System.out.println("Error: la entrada debe consistir en \n nº1: fichero de entrada\n nº2: Tipo de analizador a usar. ");
    		printopciones();
    	}
    	else {
    		int opcion = Integer.parseInt(args[1]);
    		switch (opcion){
    		case 0: {
    			System.out.println("Ejecutando primer analizador");
    			EjecutaCalc(args[0]);
    			break;
    		}
    		case 1: {
    			System.out.println("Ejecutando segundo analizador");
    			EjecutaC(args[0]);
    			break;
    		}
    		case 2: {
    			System.out.println("Ejecutando tercer analizador");
    			EjecutaXML(args[0]);
    			break;
    		}
    		default: {
    			System.out.println("Error: debe ser una de las opciones citadas:");
    			printopciones();
    			break;                                                                                                 
    		}
    	}
    		
    	}
	}
}
